package br.com.ds3.dao;

import java.util.Date;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;

import br.com.caelum.vraptor.ioc.Component;
import br.com.ds3.model.Atividade;
import br.com.ds3.model.Evento;
import br.com.ds3.util.DS3Util;

@Component
public class EventoDAO extends GenericDAO <Evento> {
	private final Long TAMANHO_PAGINA = new Long(3);
	
	@Override
	public Class<Evento> getModelClass() {
		return Evento.class;
	}
	
    private Criteria createCriteriaPesquisa(String nome) {
        Criteria criteria = getSession().createCriteria(getModelClass());
        
        if (!DS3Util.isEmtpy(nome)) {
        	criteria.add(Restrictions.like("nome", nome.toUpperCase() + "%"));
        }
        
        return criteria;
    }
    
    public Long countPaginas(String nome) {
    	Criteria criteria = createCriteriaPesquisa(nome);
    	
    	Long quantidadeRegistros = countCriteria(criteria);
    	
    	Long paginas = countPaginas(quantidadeRegistros, TAMANHO_PAGINA);
    	
    	return paginas;
    }
    
    public List<Evento> pesquisa(String nome, Long pagina) {
		Criteria criteria = createCriteriaPesquisa(nome);
		criteria.addOrder(Order.asc("nome"));
		return executaCriteria(criteria, pagina, TAMANHO_PAGINA);
	}
    
    public List<Evento> listaProximosEventos() {
		Criteria criteria = getSession().createCriteria(getModelClass());
		
		DetachedCriteria subQuery = DetachedCriteria.forClass(Atividade.class);
		subQuery.add(Restrictions.ge("data", new Date()));
		subQuery.createAlias("evento", "e");
		subQuery.setProjection(Property.forName("e.id"));
				
		criteria.add(Property.forName("id").in(subQuery));
		return executaCriteria(criteria, null, null);
	}
}
